home *** CD-ROM | disk | FTP | other *** search
/ Visual Cafe 3 / Visual Cafe 3.ISO / Vcafe / Main.bin / JListChooser.java < prev    next >
Text File  |  1998-11-05  |  29KB  |  835 lines

  1. package com.symantec.itools.swing;
  2.  
  3. import java.beans.*;
  4. import java.awt.*;
  5. import com.sun.java.swing.*;
  6. import java.util.Vector;
  7. import com.symantec.itools.swing.borders.TitledBorder;
  8. import com.sun.java.swing.border.Border;
  9. import java.awt.event.*;
  10. import java.util.Enumeration;
  11. import com.symantec.itools.swing.models.StringListModel;
  12. import com.sun.java.swing.event.ListDataListener ;
  13. import com.sun.java.swing.event.ListDataEvent;
  14. import com.sun.java.swing.event.ListDataListener;
  15. import java.util.ResourceBundle;
  16.  
  17.  
  18. public class JListChooser extends JPanel implements ListDataListener
  19. {
  20.     public static final int WIZARDPANEL_WIDTH = 440;
  21.     public static final int WIZARDPANEL_HEIGHT = 240;
  22.     static final Dimension WINDOWS_DIMENSION= new Dimension(20,20);
  23.     static final Dimension MOTIF_DIMENSION= new Dimension(35,35);
  24.     
  25.     public JListChooser()
  26.     {
  27.         super();
  28.         
  29.         try{
  30.             ResourceBundle resources = ResourceBundle.getBundle("com.symantec.itools.swing.JListChooserResourceBundle");
  31.             
  32.             setLayout(new BorderLayout());
  33.             jPanel1.setLayout( new GridBagLayout() );
  34.             add(jPanel1,"Center");
  35.             setSize( new Dimension( WIZARDPANEL_WIDTH, WIZARDPANEL_HEIGHT ) );
  36.             setBorderTitle(m_BeanBorder,resources.getString(JListChooserResourceBundle.BEAN_KEY));
  37.             setBorderTitle(m_AvailableBorder, resources.getString(JListChooserResourceBundle.AVAILABLE_KEY));
  38.             setBorderTitle(m_SelectedBorder, resources.getString(JListChooserResourceBundle.SELECTED_KEY));
  39.             
  40.             jPanel1.setBorder( m_BeanBorder );
  41.             jPnlCommandBtns.setLayout(new GridLayout(4,1,0,2));
  42.             
  43.             jPnlUpDownBtns.setLayout(new GridLayout(1,2,0,2));
  44.             //adding the 4 buttons
  45.             jPnlCommandBtns.add(jBtnAdd);
  46.             jPnlCommandBtns.add(jBtnRemove);
  47.             jPnlCommandBtns.add(jBtnAddAll);
  48.             jPnlCommandBtns.add(jBtnClear);
  49.             
  50.             //setting the 4 buttons labels
  51.             jBtnAdd.setText(resources.getString(JListChooserResourceBundle.ADD_KEY));
  52.             jBtnRemove.setText(resources.getString(JListChooserResourceBundle.REMOVE_KEY));
  53.             jBtnAddAll.setText(resources.getString(JListChooserResourceBundle.ADDALL_KEY));
  54.             jBtnClear.setText(resources.getString(JListChooserResourceBundle.CLEAR_KEY));
  55.             
  56.             //disabling the 4 buttons
  57.             jBtnAdd.setEnabled(false);
  58.             jBtnRemove.setEnabled(false);
  59.             jBtnAddAll.setEnabled(false);
  60.             jBtnClear.setEnabled(false);
  61.  
  62.  
  63.             //btnUp and btnDown settings
  64.             jBtnUp.setEnabled(false);
  65.             imageIconUp=new ImageIcon(getImageResource("Up.gif"));
  66.             jBtnUp.setMargin( new Insets(1,1,1,1) );
  67.             jBtnUp.setIcon(imageIconUp );
  68.             jPnlUpDownBtns.add(jBtnUp);
  69.             jBtnDown.setEnabled(false);
  70.             jBtnDown.setMargin( new Insets(1,1,1,1) );
  71.             imageIconDown=new ImageIcon(getImageResource("Down.gif"));
  72.             jBtnDown.setIcon(imageIconDown );
  73.             jPnlUpDownBtns.add(jBtnDown);
  74.             jScrollPane1.setBorder(m_AvailableBorder);
  75.             jPanel1.add(jScrollPane1, new com.symantec.itools.awt.GridBagConstraintsD(0,0,1,1,1.0,1.0,java.awt.GridBagConstraints.CENTER,java.awt.GridBagConstraints.BOTH,new Insets(5,5,0,0),0,0));
  76.             jScrollPane1.getViewport().add(jLstAvailable);
  77.             jScrollPane1.setPreferredSize(new Dimension(10,0));
  78.             
  79.             jPanel1.add(jPnlCommandBtns, new com.symantec.itools.awt.GridBagConstraintsD(1,0,1,1,0.1,0.5,java.awt.GridBagConstraints.SOUTH,java.awt.GridBagConstraints.NONE,new Insets(0,10,0,10),0,0));
  80.             jScrollPane2.setBorder(m_SelectedBorder);
  81.             
  82.             jScrollPane2.setPreferredSize(new Dimension(10,0));
  83.             
  84.             jPanel1.add(jScrollPane2, new com.symantec.itools.awt.GridBagConstraintsD(2,0,1,1,1.0,1.0,java.awt.GridBagConstraints.CENTER,java.awt.GridBagConstraints.BOTH,new Insets(5,0,0,5),0,0));
  85.             jScrollPane2.getViewport().add(jLstSelected);
  86.             jPanel1.add(jPnlUpDownBtns, new com.symantec.itools.awt.GridBagConstraintsD(2,1,1,1,0.0,0.0,java.awt.GridBagConstraints.NORTH,java.awt.GridBagConstraints.NONE,new Insets(5,0,5,0),0,0));
  87.             
  88.             //{{REGISTER_LISTENERS
  89.             SymListSelection lSymListSelection = new SymListSelection();
  90.             jLstSelected.addListSelectionListener(lSymListSelection);
  91.             jLstAvailable.addListSelectionListener(lSymListSelection);
  92.  
  93.             SymMouse lSymMouse = new SymMouse();
  94.             jBtnUp.addActionListener(lSymMouse);
  95.             jBtnDown.addActionListener(lSymMouse);
  96.             jBtnClear.addActionListener(lSymMouse);
  97.             jBtnRemove.addActionListener(lSymMouse);
  98.             jBtnAdd.addActionListener(lSymMouse);
  99.             jBtnAddAll.addActionListener(lSymMouse);
  100.             
  101.             SymMouseClicked lSymMouseClicked = new SymMouseClicked();
  102.             jLstSelected.addMouseListener(lSymMouseClicked);
  103.             jLstAvailable.addMouseListener(lSymMouseClicked);
  104.             
  105.             //work around for a bug in JFC
  106.             String platform=UIManager.getLookAndFeel().getID();
  107.             if(platform.equals("Windows") || platform.equals("Metal") || platform.equals("Motif")){
  108.                 //we force the first time a Windows LnF
  109.                 setButtonsUI("Windows");
  110.                 setButtonsUI(platform);
  111.             }
  112.         }
  113.         catch(Exception e){
  114.             //???RKM??? Why does this not throw ???
  115.             System.out.println(e.getMessage()+"in JListChooser constructor");
  116.         }
  117.         
  118.     }
  119.  
  120.  
  121.     Border m_BeanBorder = new TitledBorder();
  122.     Border m_AvailableBorder = new TitledBorder();
  123.     Border m_SelectedBorder = new TitledBorder();
  124.     ImageIcon imageIconUp = new ImageIcon();
  125.     ImageIcon imageIconDown = new ImageIcon();
  126.  
  127.     DefaultListModel m_AvailableListModel=new DefaultListModel();
  128.     DefaultListModel m_SelectedListModel=new DefaultListModel();
  129.     boolean isAvailableStringListModel;
  130.     boolean isSelectedStringListModel;
  131.  
  132.     JPanel jPanel1 = new JPanel();
  133.     JPanel jPnlCommandBtns = new JPanel();
  134.     JPanel  jPnlUpDownBtns= new JPanel();
  135.     JButton jBtnClear= new JButton() ;
  136.     JButton jBtnAddAll= new JButton();
  137.     JButton jBtnAdd = new JButton();
  138.     JButton jBtnRemove= new JButton();
  139.     JButton jBtnUp = new JButton();
  140.     JButton jBtnDown = new JButton();
  141.     JScrollPane jScrollPane1 = new JScrollPane();
  142.     JList jLstAvailable = new JList();
  143.     JScrollPane jScrollPane2 = new JScrollPane();
  144.     JList jLstSelected = new JList();
  145.     Vector listenersListChooserEvent=new Vector();
  146.     ListModel origAvailableListModel=null;
  147.     ListModel origSelectedListModel=null;
  148.     Dimension buttonDimension;
  149.     
  150.   
  151.     public Dimension getPreferredSize(){
  152.         return new Dimension(WIZARDPANEL_WIDTH,WIZARDPANEL_HEIGHT);
  153.     }
  154.     public JButton getAddAllButton(){
  155.         return jBtnAddAll;
  156.     }
  157.     public JButton getClearButton(){
  158.         return jBtnClear;
  159.     }
  160.     public JButton getAddButton(){
  161.         return jBtnAdd;
  162.     }
  163.     public JButton getRemoveButton(){
  164.         return jBtnRemove;
  165.     }
  166.     public JList getAvailableList(){
  167.         return jLstAvailable;
  168.     }
  169.     public JList getSelectedList(){
  170.         return jLstSelected;
  171.     }
  172.  
  173.     public void setFont(Font font){
  174.         if(jLstAvailable==null || jLstSelected==null){
  175.             return;
  176.         }
  177.         jLstAvailable.setFont(font);
  178.         jLstSelected.setFont(font);
  179.     }
  180.  
  181.     public void setForeground(Color fore){
  182.         if(jLstAvailable==null || jLstSelected==null){
  183.             return;
  184.         }
  185.         jLstAvailable.setForeground(fore);
  186.         jLstSelected.setForeground(fore);
  187.     }
  188.  
  189.      public void setBackground(Color back){
  190.         if(jPanel1==null || jScrollPane1==null || jScrollPane2==null){
  191.             return;
  192.         }
  193.         jPanel1.setBackground(back);
  194.         jScrollPane1.setBackground(back);
  195.         jScrollPane2.setBackground(back);
  196.      }
  197.  
  198.      private void setBorderTitle(Border bord, String title){
  199.         if(bord instanceof TitledBorder){
  200.             ((TitledBorder)bord).setTitle(title);
  201.         }
  202.      }
  203.      
  204.      private void setButtonsUI(String plat){
  205.         
  206.         //???RKM??? I do not think we should be doing this
  207.         if(plat.equals("Windows")){
  208.             jBtnAdd.setUI(new com.sun.java.swing.plaf.windows.WindowsButtonUI());
  209.             jBtnRemove.setUI(new com.sun.java.swing.plaf.windows.WindowsButtonUI());
  210.             jBtnAddAll.setUI(new com.sun.java.swing.plaf.windows.WindowsButtonUI());
  211.             jBtnClear.setUI(new com.sun.java.swing.plaf.windows.WindowsButtonUI());
  212.         }
  213.         else if(plat.equals("Metal")){
  214.             jBtnAdd.setUI(new com.sun.java.swing.plaf.metal.MetalButtonUI());
  215.             jBtnRemove.setUI(new com.sun.java.swing.plaf.metal.MetalButtonUI());
  216.             jBtnAddAll.setUI(new com.sun.java.swing.plaf.metal.MetalButtonUI());
  217.             jBtnClear.setUI(new com.sun.java.swing.plaf.metal.MetalButtonUI());
  218.         }
  219.         else if(plat.equals("Motif")){
  220.             jBtnAdd.setUI(new com.sun.java.swing.plaf.motif.MotifButtonUI());
  221.             jBtnRemove.setUI(new com.sun.java.swing.plaf.motif.MotifButtonUI());
  222.             jBtnAddAll.setUI(new com.sun.java.swing.plaf.motif.MotifButtonUI());
  223.             jBtnClear.setUI(new com.sun.java.swing.plaf.motif.MotifButtonUI());
  224.         }
  225.      }
  226.  
  227.  
  228.  
  229.  
  230.     private DefaultListModel  castToDefaultModel(StringListModel model){
  231.         DefaultListModel retValue= new DefaultListModel();
  232.         Enumeration enumList=model.elements();
  233.         while(enumList.hasMoreElements()){
  234.             retValue.addElement(enumList.nextElement());
  235.         }
  236.         return retValue;
  237.     }
  238.  
  239.     private ListModel  castToStringListModel(DefaultListModel model, boolean val){
  240.         ListModel retValue;
  241.         if(val){
  242.             retValue= new StringListModel();
  243.             Enumeration enumList=model.elements();
  244.             while(enumList.hasMoreElements()){
  245.                 ((StringListModel)retValue).addElement(enumList.nextElement());
  246.             }
  247.         }
  248.         else{
  249.             retValue=model;
  250.         }
  251.         return retValue;
  252.     }
  253.  
  254.  
  255.  
  256.     public void setAvailableListModel(ListModel lModel){
  257.         if(lModel==null){
  258.             throw new IllegalArgumentException("Cannot set a null ListModel");
  259.         }
  260.  
  261.         if(lModel instanceof DefaultListModel){
  262.              m_AvailableListModel=(DefaultListModel)lModel;
  263.         }
  264.         else if(lModel instanceof StringListModel)
  265.         {
  266.             m_AvailableListModel=castToDefaultModel((StringListModel)lModel);
  267.             isAvailableStringListModel=true;
  268.         }
  269.         else{
  270.             System.out.println("This model is not supported");
  271.         }
  272.         if(origAvailableListModel!=lModel){
  273.             //we want that to happen only once
  274.             if(origAvailableListModel!=null){
  275.                 //we remove as a listener from the previos list
  276.                 origAvailableListModel.removeListDataListener(this);
  277.             }
  278.             lModel.addListDataListener(this);
  279.             origAvailableListModel=lModel;
  280.         }
  281.         jLstAvailable.setModel(m_AvailableListModel);
  282.         SwingUtilities.updateComponentTreeUI(jScrollPane1);//vasu - for scrollbars
  283.         jBtnAddAll.setEnabled(m_AvailableListModel.getSize()!=0);
  284.     }
  285.  
  286.     public ListModel getAvailableListModel(){
  287.             return castToStringListModel(m_AvailableListModel,isAvailableStringListModel);
  288.     }
  289.  
  290.     public void setSelectedListModel(ListModel lModel){
  291.         if(lModel==null){
  292.             throw new IllegalArgumentException("Cannot set a null ListModel");
  293.         }
  294.         if(lModel instanceof DefaultListModel){
  295.              m_SelectedListModel=(DefaultListModel)lModel;
  296.         }
  297.         else if(lModel instanceof StringListModel)
  298.         {
  299.             m_SelectedListModel=castToDefaultModel((StringListModel)lModel);
  300.             isSelectedStringListModel=true;
  301.         }
  302.         else{
  303.             System.out.println("This model is not supported");
  304.         }
  305.         if(origSelectedListModel!=lModel){
  306.             //we want that to happen only once
  307.             if(origSelectedListModel!=null){
  308.                 //we remove as a listener from the previos list
  309.                 origSelectedListModel.removeListDataListener(this);
  310.             }
  311.             lModel.addListDataListener(this);
  312.             origSelectedListModel=lModel;
  313.         }
  314.         jLstSelected.setModel(m_SelectedListModel);
  315.         SwingUtilities.updateComponentTreeUI(jScrollPane2);//vasu - for scrollbars
  316.         jBtnClear.setEnabled(m_SelectedListModel.getSize()!=0);
  317.     }
  318.  
  319.     public ListModel getSelectedListModel(){
  320.         return castToStringListModel(m_SelectedListModel,isSelectedStringListModel);
  321.     }
  322.  
  323.  
  324.     class SymListSelection implements com.sun.java.swing.event.ListSelectionListener
  325.     {
  326.         public void valueChanged(com.sun.java.swing.event.ListSelectionEvent event)
  327.         {
  328.             Object object = event.getSource();
  329.             if (object == jLstSelected){
  330.                 jLstSelected_valueChanged(event);
  331.             }
  332.             else if (object == jLstAvailable){
  333.                 jLstAvailable_valueChanged(event);
  334.             }
  335.         }
  336.     }
  337.  
  338.    public void addListChooserEventListener(ListChooserEventListener member){
  339.         listenersListChooserEvent.addElement(member);
  340.     }
  341.  
  342.     public void removeListChooserEventListener(ListChooserEventListener member){
  343.         listenersListChooserEvent.removeElement(member);
  344.     }
  345.  
  346.     public  synchronized void fireListChooserEvent(ListChooserEvent e)
  347.     {
  348.       Vector targets;
  349.       synchronized (this) {
  350.           targets = (Vector) listenersListChooserEvent.clone();
  351.       }
  352.       int size=targets.size();
  353.       for (int i = 0; i < size; i++) {
  354.           ListChooserEventListener target = (ListChooserEventListener)targets.elementAt(i);
  355.           target.handleEvent(e);
  356.       }
  357.     }
  358.  
  359.  
  360.  
  361.     void jLstSelected_valueChanged(com.sun.java.swing.event.ListSelectionEvent event){
  362.         int[] temp=jLstSelected.getSelectedIndices();
  363.         jBtnUp.setEnabled((jLstSelected.getSelectedIndex()!=-1 && cutSelectionUp(temp).length!=0));
  364.         jBtnDown.setEnabled((jLstSelected.getSelectedIndex()!=-1 && cutSelectionDown(temp).length!=0));
  365.         jBtnRemove.setEnabled((jLstSelected.getSelectedIndex()!=-1));
  366.         jBtnAdd.setEnabled((jLstAvailable.getSelectedIndex()!=-1));
  367.  
  368.     }
  369.  
  370.     void jLstAvailable_valueChanged(com.sun.java.swing.event.ListSelectionEvent event){
  371.         jBtnAdd.setEnabled((jLstAvailable.getSelectedIndex()!=-1));
  372.     }
  373.  
  374.      class SymMouse implements java.awt.event.ActionListener
  375.     {
  376.         public void actionPerformed(java.awt.event.ActionEvent event)
  377.         {
  378.             
  379.             Object object = event.getSource();
  380.  
  381.             if (object == jBtnUp && jBtnUp.isEnabled() ){
  382.                 jBtnUp_actionPerformed(event);
  383.                 fireListChooserEvent(new ListChooserEvent(this,
  384.                     getAvailableListModel(),getSelectedListModel(),ListChooserEvent.UP));
  385.             }
  386.             else if (object == jBtnDown && jBtnDown.isEnabled()){
  387.                 jBtnDown_actionPerformed(event);
  388.                 fireListChooserEvent(new ListChooserEvent(this,
  389.                     getAvailableListModel(),getSelectedListModel(),ListChooserEvent.DOWN));
  390.             }
  391.             else if (object == jBtnClear && jBtnClear.isEnabled()){
  392.                 jBtnClear_actionPerformed(event);
  393.                 fireListChooserEvent(new ListChooserEvent(this,
  394.                     getAvailableListModel(),getSelectedListModel(),ListChooserEvent.CLEAR));
  395.             }
  396.             else if (object == jBtnRemove && jBtnRemove.isEnabled()){
  397.                 jBtnRemove_actionPerformed(event);
  398.                 fireListChooserEvent(new ListChooserEvent(this,
  399.                     getAvailableListModel(),getSelectedListModel(),ListChooserEvent.REMOVE));
  400.             }
  401.             else if (object == jBtnAdd && jBtnAdd.isEnabled() ){
  402.                 jBtnAdd_actionPerformed(event);
  403.                 fireListChooserEvent(new ListChooserEvent(this,
  404.                     getAvailableListModel(),getSelectedListModel(),ListChooserEvent.ADD));
  405.             }
  406.             else if (object == jBtnAddAll && jBtnAddAll.isEnabled()){
  407.                 jBtnAddAll_actionPerformed(event);
  408.                 fireListChooserEvent(new ListChooserEvent(this,
  409.                     getAvailableListModel(),getSelectedListModel(),ListChooserEvent.ADD_ALL));
  410.             }
  411.         }
  412.     }
  413.  
  414.             
  415.     class SymMouseClicked extends java.awt.event.MouseAdapter
  416.     {
  417.         public void mouseClicked(java.awt.event.MouseEvent event)
  418.         {
  419.             int clickCount=event.getClickCount();
  420.             Object object = event.getSource();
  421.             if (object == jLstSelected && clickCount==2 ){
  422.                 jBtnRemove_actionPerformed(null);
  423.                 fireListChooserEvent(new ListChooserEvent(this,
  424.                     getAvailableListModel(),getSelectedListModel(),ListChooserEvent.REMOVE));
  425.             }
  426.             else if (object == jLstAvailable && clickCount==2 ){
  427.                 jBtnAdd_actionPerformed(null);
  428.                 fireListChooserEvent(new ListChooserEvent(this,
  429.                     getAvailableListModel(),getSelectedListModel(),ListChooserEvent.ADD));
  430.             }
  431.         }
  432.     }
  433.  
  434.  
  435.     void jBtnUp_actionPerformed(java.awt.event.ActionEvent event)
  436.     {
  437.         int[] tempSelect=jLstSelected.getSelectedIndices();
  438.         int[] temp=jLstSelected.getSelectedIndices();
  439.         moveUp(m_SelectedListModel,cutSelectionUp(temp));
  440.         jLstSelected.setModel(m_SelectedListModel);
  441.         jLstSelected.setSelectedIndices(lowerSelectedIndices(tempSelect));
  442.     }
  443.  
  444.  
  445.     void jBtnDown_actionPerformed(java.awt.event.ActionEvent event)
  446.     {
  447.         int[] tempSelect=jLstSelected.getSelectedIndices();
  448.         int[] temp=jLstSelected.getSelectedIndices();
  449.         moveDown(m_SelectedListModel,cutSelectionDown(temp));
  450.         jLstSelected.setModel(m_SelectedListModel);
  451.         jLstSelected.setSelectedIndices(upperSelectedIndices(tempSelect));
  452.  
  453.     }
  454.  
  455.     void jBtnAddAll_actionPerformed(java.awt.event.ActionEvent event)
  456.     {
  457.         if(m_AvailableListModel.getSize()==0){
  458.             return;
  459.         }
  460.         Enumeration availableEnum=m_AvailableListModel.elements();
  461.         //use a temporary model to avoid updates to JList
  462.         //this improves performance considerably
  463.         DefaultListModel tempModel =  new DefaultListModel();
  464.         //add existing elements first
  465.         Enumeration selectedEnum=m_SelectedListModel.elements();
  466.         while(selectedEnum.hasMoreElements()){
  467.             Object obj=selectedEnum.nextElement();
  468.             tempModel.addElement(obj);//vasu
  469.         }
  470.         //then add others
  471.         while(availableEnum.hasMoreElements()){
  472.             Object obj=availableEnum.nextElement();
  473.             tempModel.addElement(obj);
  474.         }
  475.         setSelectedListModel(tempModel);
  476.         m_AvailableListModel.clear();
  477.         jBtnAddAll.setEnabled(false);
  478.         jBtnClear.setEnabled(true);
  479.     }
  480.  
  481.     void jBtnAdd_actionPerformed(java.awt.event.ActionEvent event)
  482.     {
  483.         if(m_AvailableListModel.getSize()==0 || jLstAvailable.getSelectedValues().length==0 ){
  484.             return;
  485.         }
  486.         int m_SelectedListModelLength=m_SelectedListModel.getSize();
  487.         Object[] tempSelect=jLstAvailable.getSelectedValues();
  488.         int[] tempIndices=jLstAvailable.getSelectedIndices();
  489.  
  490.         //
  491.         //use a temporary model to avoid updates to JList
  492.         //this improves performance considerably
  493.         DefaultListModel tempModel =  new DefaultListModel();
  494.         //add existing elements first
  495.         Enumeration selectedEnum=m_SelectedListModel.elements();
  496.         while(selectedEnum.hasMoreElements()){
  497.             Object obj=selectedEnum.nextElement();
  498.             tempModel.addElement(obj);
  499.         }
  500.         for(int i=0;i<tempSelect.length;i++){
  501.             tempModel.addElement(tempSelect[i]);
  502.         }
  503.         setSelectedListModel(tempModel);
  504.         int[] newIndeces=new int[tempIndices.length];
  505.  
  506.         for(int i=0;i<newIndeces.length;i++){
  507.             // so that this works when elements
  508.             //are not removed from list
  509.             m_AvailableListModel.removeElementAt(tempIndices[i]-i);
  510.             newIndeces[i]=m_SelectedListModelLength+i;
  511.         }
  512.         jLstSelected.setSelectedValue(m_SelectedListModel.getElementAt(newIndeces[ newIndeces.length-1]),true);
  513.         jLstSelected.setSelectedIndices(newIndeces);
  514.         jBtnAddAll.setEnabled((m_AvailableListModel.getSize()!=0));
  515.         jBtnClear.setEnabled(true);
  516.     }
  517.  
  518.     void jBtnRemove_actionPerformed(java.awt.event.ActionEvent event)
  519.     {
  520.         if(m_SelectedListModel.getSize()==0 || jLstSelected.getSelectedValues().length==0){
  521.             return;
  522.         }
  523.         int m_AvailableListModelLength=m_AvailableListModel.getSize();
  524.         Object[] tempSelect=jLstSelected.getSelectedValues();
  525.         int[] tempIndices=jLstSelected.getSelectedIndices();
  526.         int[] newIndeces=new int[tempIndices.length];
  527.  
  528.         DefaultListModel tempModel =  new DefaultListModel();
  529.         //add existing elements first
  530.         Enumeration availableEnum=m_AvailableListModel.elements();
  531.         while(availableEnum.hasMoreElements()){
  532.             Object obj=availableEnum.nextElement();
  533.             tempModel.addElement(obj);
  534.         }
  535.         for(int i=0;i<tempSelect.length;i++){
  536.  
  537.             Object obj=m_SelectedListModel.getElementAt(tempIndices[i]-i);
  538.             m_SelectedListModel.removeElementAt(tempIndices[i]-i);
  539.             tempModel.addElement(obj);
  540.             //select the last index (in case of repetitions)
  541.             //newIndeces[i]=m_AvailableListModel.lastIndexOf(obj);
  542.             newIndeces[i]=tempModel.lastIndexOf(obj);
  543.         }
  544.         setAvailableListModel(tempModel);
  545.  
  546.         jLstAvailable.setSelectedValue(m_AvailableListModel.getElementAt(newIndeces[ newIndeces.length-1]),true);
  547.         jLstAvailable.setSelectedIndices(newIndeces);
  548.         jBtnAddAll.setEnabled(true);
  549.         jBtnClear.setEnabled((m_SelectedListModel.getSize()!=0));
  550.  
  551.     }
  552.  
  553.     private String[] extractRows(String[] data,int[] indices){
  554.         Vector temp=new Vector();
  555.  
  556.         String[] retValue=new String[data.length-indices.length];
  557.         try{
  558.         for(int i=0;i<data.length;i++){
  559.             temp.insertElementAt(data[i],i);
  560.         }
  561.         for(int i=0;i<indices.length;i++){
  562.             temp.removeElement(data[indices[i]]);
  563.         }
  564.         temp.copyInto(retValue);
  565.         }
  566.         catch(Exception e){
  567.             System.out.println(e.getMessage());
  568.         }
  569.         return retValue;
  570.     }
  571.  
  572.     void jBtnClear_actionPerformed(java.awt.event.ActionEvent event)
  573.     {
  574.         if(m_SelectedListModel.getSize()==0){
  575.             return;
  576.         }
  577.         Enumeration selectedEnum=m_SelectedListModel.elements();
  578.         //use a temporary model to avoid updates to JList
  579.         //this improves performance considerably
  580.         DefaultListModel tempModel =  new DefaultListModel();
  581.         //add existing elements first
  582.         Enumeration availableEnum=m_AvailableListModel.elements();
  583.         while(availableEnum.hasMoreElements()){
  584.             Object obj=availableEnum.nextElement();
  585.             tempModel.addElement(obj);
  586.         }
  587.         //then add other elements
  588.         while(selectedEnum.hasMoreElements()){
  589.             Object obj=selectedEnum.nextElement();
  590.             tempModel.addElement(obj);
  591.         }
  592.         setAvailableListModel(tempModel);
  593.         m_SelectedListModel.clear();
  594.  
  595.         jBtnRemove.setEnabled(false);
  596.         jBtnClear.setEnabled(false);
  597.         jBtnAddAll.setEnabled(true);
  598.  
  599.  
  600.     }
  601.  
  602.     private void moveUp(DefaultListModel data, int[] selection){
  603.         //create a temporary model first - models already plugged into lists
  604.         //take a lot of time
  605.         DefaultListModel tempModel =  new DefaultListModel();
  606.         Enumeration en = data.elements();
  607.         while(en.hasMoreElements()){
  608.             tempModel.addElement(en.nextElement());
  609.         }
  610.         //int lengthData=data.length;
  611.         int lengthSelection=selection.length;
  612.         Object temp=null;
  613.         for(int i=0;i<lengthSelection;i++){
  614.                 temp=tempModel.elementAt(selection[i]-1);
  615.                 tempModel.setElementAt(tempModel.getElementAt(selection[i]),selection[i]-1);
  616.                 tempModel.setElementAt(temp,selection[i]);
  617.         }
  618.         setSelectedListModel(tempModel);//here till such time a better way is found
  619.     }
  620.  
  621.  
  622.     private void moveDown(DefaultListModel data, int[] selection){
  623.         //int lengthData=data.length;
  624.         //create a temporary model first - models already plugged into lists
  625.         //take a lot of time
  626.         DefaultListModel tempModel =  new DefaultListModel();
  627.         Enumeration en = data.elements();
  628.         while(en.hasMoreElements()){
  629.             tempModel.addElement(en.nextElement());
  630.         }
  631.         int lengthSelection=selection.length;
  632.         Object temp=null;
  633.         for(int i=lengthSelection-1;i>=0;i--){
  634.                 temp=tempModel.elementAt(selection[i]+1);
  635.                 tempModel.setElementAt(tempModel.getElementAt(selection[i]),selection[i]+1);
  636.                 tempModel.setElementAt(temp,selection[i]);
  637.         }
  638.         setSelectedListModel(tempModel);//here till such time a better way is found
  639.     }
  640.  
  641.  
  642.     private int[] lowerSelectedIndices(int[] indices){
  643.         int length=indices.length;
  644.         int minLength=0;
  645.         int[] retValue=new int[length];
  646.         int i;
  647.         for(i=0;i<length;i++){
  648.             if(indices[i]!=minLength){
  649.                 retValue[i]=indices[i]-1;
  650.             }
  651.             else{
  652.                 retValue[i]=indices[i];
  653.                 minLength++;
  654.             }
  655.  
  656.         }
  657.         jLstSelected.setSelectedValue(m_SelectedListModel.getElementAt(retValue[0]),true);
  658.         return retValue;
  659.     }
  660.  
  661.     private int[] upperSelectedIndices(int[] indices){
  662.         int length=indices.length;
  663.         int dataLength=m_SelectedListModel.getSize();
  664.         int[] retValue=new int[length];
  665.         for(int i=length-1;i>=0;i--){
  666.             if(indices[i]!=dataLength-1){
  667.                 retValue[i]=indices[i]+1;
  668.             }
  669.             else{
  670.                 retValue[i]=indices[i];
  671.                 dataLength--;
  672.             }
  673.         }
  674.         jLstSelected.setSelectedValue(m_SelectedListModel.getElementAt(retValue[length-1]),true);
  675.         return retValue;
  676.     }
  677.  
  678.     private int[] cutSelectionUp(int[] selection){
  679.         int[] retValue=null;
  680.         int length=selection.length;
  681.         int indices=0;
  682.         int values=0;
  683.         int i=0;
  684.         if(selection[0]!=0){
  685.             return selection;
  686.         }
  687.         for(i=0;i<length;i++){
  688.             indices+=i;
  689.             values+=selection[i];
  690.             if(indices!=values){
  691.                 break;
  692.             }
  693.         }
  694.         if(i==length){
  695.             retValue=(new int[0]);
  696.         }
  697.         else{
  698.             int[] temp=new int[length-i];
  699.             System.arraycopy(selection,i,temp,0,length-i);
  700.             retValue=temp;
  701.         }
  702.         return retValue;
  703.     }
  704.  
  705.     private int[] cutSelectionDown(int[] selection){
  706.         int[] retValue=null;
  707.         int length=selection.length;
  708.         int indices=0;
  709.         int indicesTemp=m_SelectedListModel.getSize()-1;
  710.         int values=0;
  711.         int i=0;
  712.         if(selection[length-1]!=m_SelectedListModel.getSize()-1){
  713.             return selection;
  714.         }
  715.         for(i=length-1;i>=0;i--){
  716.             indices=indices+indicesTemp;
  717.             indicesTemp--;
  718.             values+=selection[i];
  719.             if(indices!=values){
  720.                 break;
  721.             }
  722.         }
  723.         if(i==-1){
  724.             retValue=(new int[0]);
  725.         }
  726.         else{
  727.             int[] temp=new int[length-i-1];
  728.             System.arraycopy(selection,i,temp,0,length-i-1);
  729.             retValue=temp;
  730.         }
  731.         return retValue;
  732.     }
  733.  
  734.     final static protected Class m_JListChooserClass = JListChooser.class;
  735.  
  736.     public byte[] getImageResource(String img){
  737.        java.io.ByteArrayOutputStream baos=null;
  738.        try{
  739.         java.io.InputStream in= m_JListChooserClass.getResourceAsStream(img);
  740.         baos=new java.io.ByteArrayOutputStream ();
  741.         byte buff[]=new byte[4096];
  742.         for(;;){
  743.             int size=in.read(buff);
  744.             if(size==-1){
  745.                 break;
  746.             }
  747.             baos.write(buff,0,size);
  748.         }
  749.        }
  750.        catch(Exception e){
  751.         System.out.println("Couldnt read button's icon");
  752.        }
  753.        return baos.toByteArray();
  754.     }
  755.  
  756.  
  757.     public void setBorder(Border bord){
  758.         m_BeanBorder=bord;
  759.         jPanel1.setBorder(m_BeanBorder);
  760.     }
  761.     public Border getBeanBorder(){
  762.         return m_BeanBorder;
  763.     }
  764.     public void setAvailableBorder(Border bord){
  765.         m_AvailableBorder=bord;
  766.         jScrollPane1.setBorder(m_AvailableBorder);
  767.     }
  768.     public Border getAvailableBorder(){
  769.         return m_AvailableBorder;
  770.     }
  771.     public void setSelectedBorder(Border bord){
  772.         m_SelectedBorder=bord;
  773.         jScrollPane2.setBorder(m_SelectedBorder);
  774.     }
  775.     public Border getSelectedBorder(){
  776.         return m_SelectedBorder;
  777.     }
  778.  
  779.     public void setAddAllLabel(String label){
  780.         jBtnAddAll.setText(label);
  781.     }
  782.     public void setClearLabel(String label){
  783.         jBtnClear.setText(label);
  784.     }
  785.     public void setAddLabel(String label){
  786.         jBtnAdd.setText(label);
  787.     }
  788.     public void setRemoveLabel(String label){
  789.         jBtnRemove.setText(label);
  790.     }
  791.  
  792.     public String getAddAllLabel(){
  793.         return  jBtnAddAll.getText();
  794.     }
  795.     public String getClearLabel(){
  796.         return jBtnClear.getText();
  797.     }
  798.     public String getAddLabel(){
  799.         return jBtnAdd.getText();
  800.     }
  801.     public String getRemoveLabel(){
  802.         return jBtnRemove.getText();
  803.     }
  804.  
  805.  
  806.     public void  contentsChanged(ListDataEvent e){
  807.         ListModel lm=(ListModel)e.getSource();
  808.         if(lm ==origAvailableListModel){
  809.             setAvailableListModel(lm);
  810.         }
  811.         else if(lm ==origSelectedListModel){
  812.             setSelectedListModel(lm);
  813.         }
  814.         else
  815.         {}
  816.  
  817.     }
  818.  
  819.     public void  intervalAdded(ListDataEvent e) {
  820.         ListModel lm=(ListModel)e.getSource();
  821.         if(lm ==origAvailableListModel){
  822.             setAvailableListModel(lm);
  823.         }
  824.         else if(lm ==origSelectedListModel){
  825.             setSelectedListModel(lm);
  826.         }
  827.         else
  828.         {}
  829.     }
  830.  
  831.     public void  intervalRemoved(ListDataEvent e) {
  832.     }
  833.  
  834.  
  835. }